#ifndef	_STRING_EX_H_
#define	_STRING_EX_H_
#include <stdbool.h>
#include <list_ex_single.h>//单链表函数

/**
 * @brief 宏定义
 *
 * 用于strSegmentCharacter函数和
 * strSegmentCharacterFast函数的
 * direction参数
 */
///从最左边开始
#define LEFT 0
///从最右边开始
#define RIGHT 1

/**
 * @brief 字符串分割.
 * 早期版本的字符串分割函数，整体速度来说效率低。返回结果字符串指针。
 * 使用相对strsegmentASCIIfast简单，分隔符只能是字符（ASCII）
 *
 * @param delimiter 分割字符
 * @param direction 方向（LEFT表示从左边开始分割，RIGHT表示从右边开始分割）
 * @param strnum 分割出来的字符串编号（从1开始编号）
 * @param src 字符串资源
 *
 * @return 返回一个被分割的字符串,如果链表首元素的word_seg为NULL，那么表示字符串没有被分割
 */
extern char *
str_segment_character(char delimiter,uint8_t direction,int32_t strnum,char *src);

///链表化字符串分割结构体
typedef struct {
	sl_node node;
	char *word_seg;
} str_seg_elem;
/**
 * @brief 字符串分割.
 *
 * 改进版本的字符串分割函数，返回一个单链表装载分割好的字符串。
 * 后续处理相对复杂，但是速度相对上面的函数有了很大的提升，分隔符只能是（ASCII）
 *
 * @param delimiter 分割字符
 * @param direction 方向（LEFT表示从左边开始分割，RIGHT表示从右边开始分割）
 * @param src 字符串资源
 *
 * @return 返回一个装有所有被分割的字符串的链表
 */
extern str_seg_elem *
str_segment_character_fast(char delimiter,uint8_t direction,const char *src);

/**
 * @brief 字符串分割链表销毁.
 *
 * 将生成的分割链表进行销毁
 *
 * @param str_list 字符串分割链表
 *
 * @return 返回true表示销毁成功，false表示销毁失败
 */
extern bool
str_segment_character_list_destroy(str_seg_elem *str_list);
/**
 * @brief 字符串数字判断.
 *
 * 判断字符串中所有字符是否是数字
 * 返回1表示全部是数字，返回-1表示有其他非数字字符存在
 *
 * @param src 字符串指针
 *
 * @return true表示成功false表示失败
 */
extern bool
is_str_digit(const char *src);
/**
 * @brief 字符串转换位有符号32位整型.
 *
 * 字符串转整形数：将字符串表示的二进制、八进制、十进制、十六进制转化为整形数
 * 本函数中负数的表示：采用取反加补的表示方法。
 * （例子：-2147483647的16进制表示:0xffffffff，取反加补后为0x80000001）
 * gcc中二进制表示方法：0bXXXX
 * gcc中八进制表示方法：0XXXX
 * gcc中十进制表示方法：±XXXX
 * gcc中十六进制表示方法：0xXXXX
 * 本函数按照上述格式进行检测，二进制、八进制、十六进制不用负号表示正负，
 * 按照32位的计算机数据表示方法将最高位置1表示，这点要注意。十进制可以输入负号表示
 *
 * @param num_str 表示数字的字符串
 *
 * @return 32位整型结果
 */
extern int32_t
atoi_sint32_ex(char *num_str);
/**
 * @brief 字符串模糊匹配算法.
 *
 * 两个字符串相同长度，且相同位置字符相同的个数和总的字符个数相比达到给定的模糊度就认为匹配
 * match_persent越低，字符串就越容易匹配
 *
 * @param dest1 目标字符串1
 * @param dest2 目标字符串2
 * @param match_persent 两个字符串的匹配率（越高越匹配，最大为1.0）
 *
 * @return
 * 返回0表示两个字符串长度相等且匹配
 * 返回1表示dest1的长度>dest2的长度
 * 返回-1表示dest1的长度<dest2的长度
 * 返回-2表示是两个字符串长度相等但是不匹配
 */
extern int32_t
str_cmp_ex(const char *dest1,const char *dest2,const double match_persent);

#endif
